package metiers;

import java.util.ArrayList;
import java.util.List;

public class Clustering {

	private Concept concept1;
	private Concept concept2;
	private List<Cluster> clusters;

	public Concept getConcept1() {
		return concept1;
	}
	public void setConcept1(Concept concept1) {
		this.concept1 = concept1;
	}
	public Concept getConcept2() {
		return concept2;
	}
	public void setConcept2(Concept concept2) {
		this.concept2 = concept2;
	}
	public List<Cluster> getClusters() {
		return clusters;
	}
	public void setClusters(List<Cluster> clusters) {
		this.clusters = clusters;
	}

	/**
	 * Constructeur d'un Clustering, qui crée les Clusters associés et les remplit
	 * @param concept1
	 * @param rangConcept1
	 * @param concept2
	 * @param rangConcept2
	 * @param listeDonnees
	 */
	public Clustering(Concept concept1, int rangConcept1, Concept concept2, int rangConcept2,List<List<String>> listeDonnees) {
		super();

		List<Cluster> listeClusters = new ArrayList<Cluster>();

		// On parcourt les lignes du tableau de données listeDonnees
		for(List<String> ligne : listeDonnees){

			String valeurAxe1 = ligne.get(rangConcept1);
			String valeurAxe2 = ligne.get(rangConcept2);
			boolean contenu = false;
			int i1 = 0;

			// A chaque ligne on trouve le cluster correspondant à cette ligne
			for(Cluster c : listeClusters){
				if(c.getModalite1().equalsIgnoreCase(valeurAxe1)&&c.getModalite2().equalsIgnoreCase(valeurAxe2)){
					contenu = true;
					i1 = listeClusters.indexOf(c);
				}
			}

			// Si le cluster existe déjà on insère la ligne dedans
			if (contenu) {
				Cluster c1 = listeClusters.get(i1);
				c1.ajouterLigne(ligne);
				listeClusters.set(i1,c1);
			}
			// Sinon on crée le cluster et on y insère la ligne 
			else {
				Cluster clusterNouveau = new Cluster(valeurAxe1, valeurAxe2);
				clusterNouveau.ajouterLigne(ligne);
				listeClusters.add(clusterNouveau);
			}

		}

		// L'objet Clustering créé est caractérisé par les deux concepts selon lesquels on
		// a fait le clustering, et il contient la liste des clusters créés.
		this.concept1 = concept1;
		this.concept2 = concept2;
		this.setClusters(listeClusters);

	}

	public Clustering() {
		super();
	}

	public Cluster getCluster(String modalite1, String modalite2){
		Cluster resultat = new Cluster();
		for(Cluster c : clusters){
			if(c.getModalite1().equals(modalite1)&& c.getModalite2().equals(modalite2)){
				resultat = c;
			}
		}
		return resultat;
	}

}
